// 首先加载环境变量
require('dotenv').config({ path: '.env.staging' });

// 使用已配置的Express应用
const app = require('./src/app');
const { logger } = require('./src/utils/logger');

// 数据库配置
const { testConnection, closePool } = require('./src/config/database');

// 全局错误处理（如果app.js中没有包含的话）
app.use((err, req, res, next) => {
  logger.error('Global error handler:', err);
  
  // Multer错误处理
  if (err.code === 'LIMIT_FILE_SIZE') {
    return res.status(400).json({
      success: false,
      message: '文件大小超出限制',
      error_code: 'FILE_TOO_LARGE'
    });
  }
  
  if (err.code === 'LIMIT_UNEXPECTED_FILE') {
    return res.status(400).json({
      success: false,
      message: '不支持的文件类型',
      error_code: 'INVALID_FILE_TYPE'
    });
  }
  
  // JWT错误处理
  if (err.name === 'JsonWebTokenError') {
    return res.status(401).json({
      success: false,
      message: '无效的访问令牌',
      error_code: 'INVALID_TOKEN'
    });
  }
  
  if (err.name === 'TokenExpiredError') {
    return res.status(401).json({
      success: false,
      message: '访问令牌已过期',
      error_code: 'TOKEN_EXPIRED'
    });
  }
  
  // 数据库错误处理
  if (err.code === 'ER_DUP_ENTRY') {
    return res.status(400).json({
      success: false,
      message: '数据已存在',
      error_code: 'DUPLICATE_ENTRY'
    });
  }
  
  // 默认错误处理
  res.status(err.status || 500).json({
    success: false,
    message: err.message || '服务器内部错误',
    error_code: err.code || 'INTERNAL_SERVER_ERROR',
    ...(process.env.NODE_ENV === 'development' && { stack: err.stack })
  });
});

// 启动服务器

const startServer = async () => {
  try {
    // 测试数据库连接
    const dbConnected = await testConnection();
    if (!dbConnected) {
      logger.error('❌ 无法连接到数据库，服务器启动失败');
      process.exit(1);
    }
    
    const PORT = process.env.PORT || 3000;
    // 启动HTTP服务器，监听所有网络接口
    app.listen(PORT, '0.0.0.0', () => {
      logger.info(`🚀 CU MR BULL API Server 启动成功!`);
      logger.info(`📍 服务器地址: http://localhost:${PORT}`);
      if (process.env.LOCAL_LAN_IP) {
        logger.info(`📍 网络地址: http://${process.env.LOCAL_LAN_IP}:${PORT}`);
      }
      logger.info(`🌍 环境: ${process.env.NODE_ENV || 'development'}`);
      logger.info(`📊 API文档: http://localhost:${PORT}/api`);
      logger.info(`💚 健康检查: http://localhost:${PORT}/health`);
      logger.info(`⏰ 启动时间: ${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Singapore' })}`);
    });
    
  } catch (error) {
    logger.error('❌ 服务器启动失败:', error);
    process.exit(1);
  }
};

// 启动服务器
startServer();

// 未捕获异常与未处理 Promise 拒绝
process.on('unhandledRejection', (reason) => {
  logger.error('Unhandled Rejection:', reason);
  if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') process.exit(1);
});

process.on('uncaughtException', (err) => {
  logger.error('Uncaught Exception:', err);
  if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') process.exit(1);
});

// 优雅关闭
process.on('SIGTERM', () => {
  logger.warn('🛑 收到SIGTERM信号，正在优雅关闭服务器...');
  process.exit(0);
});

process.on('SIGINT', () => {
  logger.warn('🛑 收到SIGINT信号，正在优雅关闭服务器...');
  process.exit(0);
});

module.exports = app;